package com.lw.netty.simple;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @author Administrator
 * @version 1.0
 * @description:
 * @date 2022/4/24 11:13
 */
public class NettyServer {
    public static void main(String[] args) {
        //创建一个服务端
        ServerBootstrap serverBootstrap=new ServerBootstrap();
        NioEventLoopGroup parentGroup = new NioEventLoopGroup();
        NioEventLoopGroup workGroup = new NioEventLoopGroup();
        serverBootstrap.group(parentGroup,workGroup)//线程组，分别用于接受请求和处理数据
                .channel(NioServerSocketChannel.class)//我们使用NIO类型的服务器通道，也就是异步的
                .option(ChannelOption.SO_BACKLOG,128)//使用TCP协议
                .childHandler(new ChannelInitializer<SocketChannel>() {//初始化我们的通道，并设置如何处理我们的请求
                    @Override
                    protected void initChannel(SocketChannel socketChannel) throws Exception {
                        socketChannel.pipeline()//获取到管道
                                .addLast(new ServerHandler());//我们到底如何处理这个请求
                    }
                });
        try {
            ChannelFuture channelFuture=serverBootstrap.bind(12581).sync();//绑定到某个端口，注意可能会绑定失败
            channelFuture.addListener(future -> {
                //服务器是不是启动成功
                boolean success=future.isSuccess();
                if(success){
                    System.err.println("服务器启动成功");
                }else {
                    System.err.println("服务器启动失败");
                }
            });//给服务器添加一个listener，来判断有没有启动成功
            //等待服务器关闭，注意这个方法不是一执行就立刻关闭，是直到内部的通道都关闭了，才会关闭服务器否则一直处于等待状态，阻塞住了
            channelFuture.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            parentGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }
}
